#include "eager_string.hpp"
#include "cow_string.hpp"
#include "sso_string.hpp"

#include <benchmark/benchmark.h>
#include <string>

using namespace StringVariants;

/**
 * @brief 基准测试：在不同初始长度下，EagerStringSimple 追加固定个数字符的耗时。
 *
 * @param state Google Benchmark 框架提供的状态对象，用于控制循环次数。
 */
static void BM_EagerStringSimpleAppend(benchmark::State &state) {
  std::string seed(static_cast<std::size_t>(state.range(0)), 'a');
  for (auto _ : state) {
    EagerStringSimple s(seed.c_str());
    for (int i = 0; i < 32; ++i) {
      s.push_back('x');
    }
    benchmark::DoNotOptimize(s.c_str());
  }
}
BENCHMARK(BM_EagerStringSimpleAppend)
    ->RangeMultiplier(2)
    ->Range(8, 256);

/**
 * @brief 基准测试：验证 CowStringSimple 在写时复制场景下的追加开销。
 *
 * @param state Google Benchmark 状态对象。
 */
static void BM_CowStringSimpleAppend(benchmark::State &state) {
  std::string seed(static_cast<std::size_t>(state.range(0)), 'b');
  for (auto _ : state) {
    CowStringSimple base(seed.c_str());
    CowStringSimple copy = base; // copy 与 base 初始共享缓冲。
    copy.push_back('y');         // 写操作触发独占复制。
    benchmark::DoNotOptimize(copy.c_str());
    benchmark::DoNotOptimize(base.c_str());
  }
}
BENCHMARK(BM_CowStringSimpleAppend)
    ->RangeMultiplier(2)
    ->Range(8, 256);

/**
 * @brief 基准测试：评估 SsoStringSimple 在短字符串范围内的追加表现。
 *
 * @param state Google Benchmark 状态对象。
 */
static void BM_SsoStringSimpleAppend(benchmark::State &state) {
  std::string seed(static_cast<std::size_t>(state.range(0)), 'c');
  for (auto _ : state) {
    SsoStringSimple s(seed.c_str());
    s.push_back('z');
    benchmark::DoNotOptimize(s.c_str());
  }
}
BENCHMARK(BM_SsoStringSimpleAppend)
    ->Range(1, static_cast<int>(SsoStringSimple::kLocalSize));

/**
 * @brief Google Benchmark 主入口。
 */
BENCHMARK_MAIN();